#include "Logger.h"

#include <fmt/format.h>
#include <spdlog/sinks/basic_file_sink.h>
#include <spdlog/sinks/stdout_color_sinks.h>
#include <spdlog/spdlog.h>
#include <stdio.h>

#include <memory>

// 初始化日志系统
void initializeLogger(const std::string& logFilePath)
{
    // 创建控制台 sink（带颜色）
    auto console_sink = std::make_shared<spdlog::sinks::stdout_color_sink_st>();
    // use relative path and ensure file is accessible
    std::shared_ptr<spdlog::sinks::basic_file_sink_mt> file_sink;
    // 创建文件 sink
    try
    {
        file_sink = std::make_shared<spdlog::sinks::basic_file_sink_mt>(logFilePath);
    }
    catch (const std::exception& e)
    {
        // if file creation fails, use console output only
        spdlog::warn("Failed to create file sink: {}", e.what());
        auto logger = std::make_shared<spdlog::logger>("multi_sink", spdlog::sinks_init_list{console_sink});
        logger->set_level(spdlog::level::debug);
        spdlog::set_default_logger(logger);
        return;
    }

    // 设置 sink 的格式
    auto file_fmt = std::make_unique<spdlog::pattern_formatter>("%^[%T] %v%$");
    file_sink->set_formatter(std::move(file_fmt));
    // auto cnsl_fmt = std::make_unique<spdlog::pattern_formatter>("[%H:%M:%S.%e] [%^%l%$] %v");
    auto cnsl_fmt = std::make_unique<spdlog::pattern_formatter>("[%H:%M:%S] [%^%l%$] %v");
    console_sink->set_formatter(std::move(cnsl_fmt));

    // 创建多 sink 日志器
    std::vector<spdlog::sink_ptr> sinks = {file_sink, console_sink};
    auto logger = std::make_shared<spdlog::logger>("multi_sink", begin(sinks), end(sinks));

    // 设置日志级别
    logger->set_level(spdlog::level::info);

    // 设置为默认日志器
    spdlog::set_default_logger(logger);
    spdlog::info("Log initialization successful");

    return;
}

// 记录信息日志
void logInfo(const std::string& message) { spdlog::info(message); }

// 记录错误日志
void logError(const std::string& message)
{
    spdlog::error(message);
    fprintf(stderr, "%s\n", message.c_str());
}

// 清理日志系统
void shutdownLogger() { spdlog::shutdown(); }

// 使用fmt格式化字符串的辅助函数
template <typename... Args>
std::string formatString(const char* format, Args&&... args)
{
    return fmt::format(format, std::forward<Args>(args)...);
}